import cv2
import numpy as np
import matplotlib.pyplot as plt


# 定义一个函数用于显示图像
def show_img(name, img):
    # 使用OpenCV的imshow函数显示图像
    cv2.imshow(name, img)
    # 等待任意键按下，参数0表示无限等待
    cv2.waitKey(0)
    # 关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()


# 读取图像文件
img = cv2.imread('noisy_pandas.jpg')

# 均值滤波
# 使用cv2.blur函数进行均值滤波，参数(3, 3)表示3x3的卷积核
blur_img = cv2.blur(img, (3, 3))
# 显示经过均值滤波处理的图像
# show_img('blur', blur_img)

# 方框滤波
# 使用cv2.boxFilter函数进行方框滤波，参数-1表示输出图像与输入图像深度一致
# 参数normalize=True表示进行归一化处理，防止像素值越界
box_img = cv2.boxFilter(img, -1, (3, 3), normalize=True)
# 显示经过方框滤波处理的图像
# show_img('box', box_img)

# 高斯滤波
# 使用cv2.GaussianBlur函数进行高斯滤波，参数(5, 5)表示5x5的卷积核，1表示高斯核的标准差
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
# 显示经过高斯滤波处理的图像
# show_img('gaussian', gaussian)

# 中值滤波 相当于用中间值代替
median = cv2.medianBlur(img, 5)
# 显示经过中值滤波处理的图像
# show_img('median', median)

# 展示所有
# res = np.hstack((blur_img, gaussian, median))
# show_img('res', res)

# 创建一个包含所有处理后图像的列表
img_list = [img, blur_img, box_img, gaussian, median]
label_list = ['noisy', 'blur', 'box', 'gaussian', 'median']

# 使用matplotlib展示所有图像
plt.figure(figsize=(10, 6))
for i in range(0, 5):
    plt.subplot(2, 3, i + 1)
    plt.imshow(img_list[i])
    plt.title(label_list[i])
    plt.xticks([]), plt.yticks([])

plt.tight_layout()
plt.show()
